/**
 * 
 */
package com.hyfrogx.modules.app.utils;


import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;

/** 
 * 自定义访问对象工具类 
 * 
 * 获取对象的IP地址等信息 
 * @author X-rapido 
 * 
 */
public class CusAccessObjectUtil { 
  
  /** 
   * 获取用户真实IP地址，不使用request.getRemoteAddr();的原因是有可能用户使用了代理软件方式避免真实IP地址, 
   * 
   * 可是，如果通过了多级反向代理的话，X-Forwarded-For的值并不止一个，而是一串IP值，究竟哪个才是真正的用户端的真实IP呢？ 
   * 答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。 
   * 
   * 如：X-Forwarded-For：192.168.1.110, 192.168.1.120, 192.168.1.130, 
   * 192.168.1.100 
   * 
   * 用户真实IP为： 192.168.1.110 
   * 
   * @param request 
   * @return 
   */
  public static String getIpAddress(HttpServletRequest request) {
  	if(request == null){
  		return "";
	}
    String ip = request.getHeader("x-forwarded-for"); 
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
      ip = request.getHeader("Proxy-Client-IP"); 
    } 
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
      ip = request.getHeader("WL-Proxy-Client-IP"); 
    } 
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
      ip = request.getHeader("HTTP_CLIENT_IP"); 
    } 
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
      ip = request.getHeader("HTTP_X_FORWARDED_FOR"); 
    } 
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
      ip = request.getRemoteAddr(); 
    } 
    return ip; 
  } 
  public static String getRealIp() throws SocketException {
	  String localip = null;// 本地IP，如果没有配置外网IP则返回它
	  String netip = null;// 外网IP

	      Enumeration<NetworkInterface> netInterfaces = NetworkInterface.getNetworkInterfaces();
	      InetAddress ip = null;
	      boolean finded = false;// 是否找到外网IP
	      while (netInterfaces.hasMoreElements() && !finded) {
	          NetworkInterface ni = netInterfaces.nextElement();
	          Enumeration<InetAddress> address = ni.getInetAddresses();
	          while (address.hasMoreElements()) {
	              ip = address.nextElement();
	              if (!ip.isSiteLocalAddress()
	                      && !ip.isLoopbackAddress()
	                      && ip.getHostAddress().indexOf(":") == -1) {// 外网IP
	                  netip = ip.getHostAddress();
	                  finded = true;
	                  break;
	              } else if (ip.isSiteLocalAddress()
	                      && !ip.isLoopbackAddress()
	                      && ip.getHostAddress().indexOf(":") == -1) {// 内网IP
	                  localip = ip.getHostAddress();
	              }
	          }
	      }

	      if (netip != null && !"".equals(netip)) {
	          return netip;
	      } else {
	          return localip;
	      }
	  }
	  public String getIpAddr(HttpServletRequest request) {

	      String ip = request.getHeader("X-Forwarded-For");
	      if(ip == null || ip.length() == 0 ||"unknown".equalsIgnoreCase(ip)) {
	          ip = request.getHeader("Proxy-Client-IP");
	      }
	      if(ip == null || ip.length() == 0 ||"unknown".equalsIgnoreCase(ip)) {
	          ip = request.getHeader("WL-Proxy-Client-IP");
	      }
	      if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
	             ip = request.getHeader("HTTP_X_FORWARDED_FOR");
	         }
	      if(ip == null || ip.length() == 0 ||"unknown".equalsIgnoreCase(ip)) {
	          ip = request.getRemoteAddr();
	      }
	      ip = request.getHeader("X-Real-IP");
	      if(StringUtils.isNotEmpty(ip) && !"unKowm".equalsIgnoreCase(ip)) {
	          return ip;
	      }
	      //    多个路由是，取得第一个非unknown的ip
	      final String[] arr = ip.split(",");
	      for(final String str : arr) {
	          if(!"unknown".equalsIgnoreCase(str)) {
	              ip = str;
	              break;
	          }
	      }
	      return ip;
	  }
    
} 
